package Java2Test.mythread.threadsafe3;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 使用显式锁实现线程安全的卖票逻辑
 */
class MyRunnable implements Runnable {
    // 共享资源：总票数
    static int ticket = 0;
    // 可重入锁实例，用于保证线程安全
    private final Lock lock = new ReentrantLock();

    @Override
    public void run() {
        while (true) {
            // 获取锁，确保同一时间只有一个线程执行后续代码
            lock.lock();
            try {
                // 检查是否售完所有票
                if (ticket == 100) {
                    break;
                } else {
                    // 模拟业务处理耗时
                    Thread.sleep(10);
                    // 线程安全的票数递增
                    ticket++;
                    System.out.println(Thread.currentThread().getName() + "正在卖第" + ticket + "张票");
                }
            } catch (InterruptedException e) {
                // 恢复中断状态，保持中断响应能力
                Thread.currentThread().interrupt();
                e.printStackTrace();
            } catch (Exception e) {
                // 处理其他异常
                e.printStackTrace();
            } finally {
                // 确保锁在任何情况下都被释放
                lock.unlock();
            }
        }
    }
}